Categories
Buefy

Buefy — Time Picker and File Input

Spread the love

Buefy is a UI framework that’s based on Bulma.

In this article, we’ll look at how to use Buefy in our Vue app.

Time Picker

Buefy has a time picker component.

We can add the b-timepicker component to use it.

For example, we can write;

<template>
  <section>
    <b-field>
      <b-timepicker
        rounded
        placeholder="Click to select..."
        enable-seconds
        hour-format="12"
        locale="en"
      ></b-timepicker>
    </b-field>
  </section>
</template>

<script>
export default {
  data() {
    return {};
  }
};
</script>

The component takes a few props.

rounded makes the input box have round corners.

placeholder has the placeholder.

enable-seconds has a dropdown to pick the seconds.

hour-format sets the hour format.

locale sets the locale.

We can make the time picker editable with the editable prop:

<template>
  <section>
    <b-field>
      <b-timepicker
        rounded
        placeholder="Click to select..."
        enable-seconds
        hour-format="12"
        locale="en"
        editable
      ></b-timepicker>
    </b-field>
  </section>
</template>

<script>
export default {
  data() {
    return {};
  }
};
</script>

The range of allowed values can be set with the min-time and max-time props:

<template>
  <section>
    <b-field>
      <b-timepicker placeholder="Click to select..." :min-time="minTime" :max-time="maxTime"></b-timepicker>
    </b-field>
  </section>
</template>

<script>
export default {
  data() {
    const min = new Date();
    min.setHours(0);
    min.setMinutes(0);
    const max = new Date();
    max.setHours(2);
    max.setMinutes(0);
    return {
      minTime: min,
      maxTime: max
    };
  }
};
</script>

The footer can be changed by populating the default slot:

<template>
  <section>
    <b-field>
      <b-timepicker v-model="time" placeholder="Click to select...">
        <button class="button is-primary" @click="time = new Date()">
          <span>Now</span>
        </button>

        <button class="button is-danger" @click="time = null">
          <span>Clear</span>
        </button>
      </b-timepicker>
    </b-field>
  </section>
</template>

<script>
export default {
  data() {
    return {
      time: new Date()
    };
  }
};
</script>

We added 2 buttons into the default slot and they’ll be displayed below the time picker.

Also, we can make it inline with the inline prop:

<template>
  <section>
    <b-field>
      <b-timepicker v-model="time" inline></b-timepicker>
    </b-field>
  </section>
</template>

<script>
export default {
  data() {
    return {
      time: new Date()
    };
  }
};
</script>

The increments of the dropdown can be set with the incrementMinutes and incrementHours props:

<template>
  <section>
    <b-field>
      <b-timepicker v-model="time" :incrementMinutes="5" :incrementHours="2"></b-timepicker>
    </b-field>
  </section>
</template>

<script>
export default {
  data() {
    return {
      time: new Date()
    };
  }
};
</script>

File Upload Input

The b-upload component is the file upload input.

For example, we can write:

<template>
  <b-field class="file is-primary" :class="{'has-name': !!file}">
    <b-upload v-model="file">
      <span class="file-cta">
        <span>Click to upload</span>
      </span>
      <span class="file-name" v-if="file">{{ file.name }}</span>
    </b-upload>
  </b-field>
</template>

<script>
export default {
  data() {
    return {
      file: null
    };
  }
};
</script>

to add it.

The file-cta class makes the input display as a button.

v-model binds the selected file to the file state.

We can make the file input appears as a drop zone with the drag-drop prop:

<template>
  <b-field class="file is-primary" :class="{'has-name': !!file}">
    <b-upload v-model="file" drag-drop>
      <section class="section">
        <div class="content has-text-centered">
          <p>Drop your files here or click to upload</p>
        </div>
      </section>
    </b-upload>
  </b-field>
</template>

<script>
export default {
  data() {
    return {
      file: null
    };
  }
};
</script>

The expanded prop makes the button longer:

<template>
  <b-field class="file">
    <b-upload v-model="file" expanded>
      <a class="button is-primary is-fullwidth">
        <span>{{ file && file.name || "Click to upload"}}</span>
      </a>
    </b-upload>
  </b-field>
</template>

<script>
export default {
  data() {
    return {
      file: null
    };
  }
};
</script>

Conclusion

We can add a time picker and file upload input with Buefy.

By John Au-Yeung

Web developer specializing in React, Vue, and front end development.

Leave a Reply

Your email address will not be published. Required fields are marked *